/**
 * String再学习
 */
public class String_intext {
    //字符串常量池
    public static void main(String[] args) {
        String s1 = "hadage";
        String s2 = "hadage";
        String S1 = new String("hadage");
        String S2 = new String("hadage");

        System.out.println(s1 == s2);//true
        System.out.println(s1 == S1);//false
        System.out.println(S1 == S2);//false
        //这样比较的是地址 s1 == s2 说明这俩个字符串指的是同一个字符串 引用的是同一个对象
        //因为字符串直接赋给变量，会将这个对象储存到字符串常量池中，这样能节省空间和运行时间，在以后再赋值给变量时
        // 会优先在常量池中查找该字符串是否存在，不存在就在创建新的对象
        //而直接使用new 去赋值字符串，那会创建一个新的对象
        StringBuilder ss = new StringBuilder("hadage");

        System.out.println(ss);
        ss.append('h');
        System.out.println(ss);

        System.out.println("  --- ");
        //intern 是将变量手动添加到常量池中
        char[] s = {'h', 'h'};
        String a1 = new String(s);//byte[] val = StringUTF16.compress(value, off, len);这表示String实际储存值的地方还会在
        //开辟一块空间储存字符串 是用new的String这个类又会指向这个数组
        a1.intern();//这时a1吧string这个类放入了常量池，在常量中会有个对象指向a1的地址
        String a = "hh";//在常量池中找，发现哟"hh"这个字符串，那么就的到了对应对象指向的地址，也就是a1的地址
        System.out.println(a1 == a);//true 所以为true
        //若传入参数为"hh"那么最终结果为false 因为hh已经在常量池中，且已经有了个对象指向这个字符串，这是a1就相当于是又创建了一个
        //对象去指向常量池中的那个对象 但是在a = "hh"这个语句中，直接得到的是常量池中的对象指向的地址，所以a1 不等与 a
    }
}
